package cn.itcast.nems.approval.bpm.eventstrategy;

import cn.itcast.nems.approval.service.ApprovalFormService.ApproveResult;

/**
 * 
 * BPM事件消息处理逻辑
 *
 * @author 刘曙
 *
 * @version 
 *
 * @since 2023年11月22日
 */
public interface BpmEventStrategy {
    
    /**
     * 
     * 功能描述：返回策略类名称
     *
     * @return 策略类名称
     * 
     * @author 刘曙
     *
     * @since 2023年11月22日
     *
     * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
     */
    public String getStrategyName();
    
    /**
     *  
     * 功能描述：收到知会
     *
     * @param formID 审批流程单ID
     * @param targetAssignee 指定要抄送的人
     * 
     * @author 刘曙
     *
     * @since 2023年11月22日
     *
     * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
     */
    public void inform(String formID, String targetAssignee);
    
    /**
     *  
     * 功能描述：审批流程所有节点全部审批通过
     *
     * @param formID 审批流程单ID
     * 
     * @author 刘曙
     *
     * @since 2023年11月22日
     *
     * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
     * @return 如果需要凭单处理完成后执行的逻辑可以放入Runnable中
     */
    Runnable finish(String formID);

    /**
     * 在finish回调出现异常时，回调该方法，在该方法里可以释放凭单锁定的资源，如：解锁学籍等操作。
     *
     * @param formID 审批流程单ID
     * @param exception finish方法抛出的异常
     * @author 李勇
     * @since 2024年3月19日
     */
    default void finishFail(String formID, Exception exception) {
    }

    /**
     * 
     * 功能描述：审批表单
     *
     * @param formID 审批流程单ID
     * @param result 审批结果
     * @param comment 审批说明
     * @param applyType  1：审批（默认））2：驳回到发起人）3：驳回上一级）
     *
     * @author 刘曙
     *
     * @since 2023年11月23日
     *
     * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
     */
    public void approve(final String formID, final ApproveResult result, final String comment, final String form, Integer applyType);
    
    /**
     * 
     * 功能描述：撤回
     *
     * @param formID 审批流程单ID
     * 
     * @author 刘曙
     *
     * @since 2023年11月23日
     *
     * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
     */
    public void cancel(final String formID);

    /**
     *
     * 功能描述：驳回发起人（开始节点）
     *
     * @param formID 审批流程单ID
     *
     * @author 陈早庆
     *
     * @since 2024年04月01日
     *
     * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
     */
    public void rollbackRequester(final String formID);

    /**
     * 
     * 功能描述：提醒
     *
     * @param formID 审批流程单ID
     * @param targetAssignee 指定要催办的人，该催办人必须为当前审批节点的审批成员。为空时默认催办节点的所有审批成员
     * 
     * @author 刘曙
     *
     * @since 2023年11月23日
     *
     * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
     */
    public void remind(final String formID, final String targetAssignee);
}
